import httb from './axios';

/**
 * 时间格式化
 * @param {string} date 时间字符串
 * @param {string} sp 分隔符
 * @returns {string} 格式化后的时间字符串
 *
 * FIXME: 继续优化
 */
export function getYMD(date, sp = '-') {
  const DD = new Date(date);
  const year = DD.getFullYear();
  let month = DD.getMonth() + 1;
  let day = DD.getDate();
  month = month <= 9 ? `0${month}` : month;
  day = day <= 9 ? `0${day}` : day;
  return year + sp + month + sp + day;
}
/**
 * 导出excel表格
 * @param {string} url 导出地址
 * @param {object} params 导出时的参数
 *
 * TODO: 这个地方可以使用其它的方法实现
 */

export function exportToExcel(url, params = {}) {
  let query = '';
  Object.keys(params)
    .forEarch((key) => {
      query += `&${key}=${params[key]}`;
    });
  query = query.substr(1);
  window.location.href = `${url}?${query}`;
}

// action工厂函数
export function createAction(method, api, mtype, init) {
  if (init === 'init') {
    return async function action({ commit }, params = {}) {
      const res = await httb[method](api, params);
      if (mtype && res.data) commit(mtype, res.data);
      return res;
    };
  }
  if (method === 'export') {
    return function ex(op, params) {
      httb.export(api, params);
    };
  }
  return async function action({ commit }, params = {}) {
    const res = await httb[method](api, params);
    if (mtype && res.data) commit(mtype, res.data);
    return res;
  };
}
export function createPutAction(method, api, mtype) {
  return async function action({ commit }, { body = {}, params = {} }) {
    const res = await httb[method](api, body, params);
    if (mtype && res.data) commit(mtype, res.data);
    return res;
  };
}

/**
 * 防抖函数，返回函数连续调用时，空闲时间必须大于或等于 wait，func 才会执行
 *
 * @param  {function} func        回调函数
 * @param  {number}   wait        表示时间窗口的间隔
 * @param  {boolean}  immediate   设置为ture时，是否立即调用函数
 * @return {function}             返回客户调用函数
 */

export function debounce(func, wait = 50, immediate = true) {
  let timer;
  let context;
  let args;

  const later = () => setTimeout(() => {
    // 延迟函数执行完毕，清空缓存的定时器序号
    timer = null;
    // 延迟执行的情况下，函数会在延迟函数中执行
    // 使用到之前缓存的参数和上下文
    if (!immediate) {
      func.apply(context, args);
      context = null;
      args = null;
    }
  }, wait);

  // 这里返回的函数是每次实际调用的函数
  return (...params) => {
    // 如果没有创建延迟执行函数（later），就创建一个
    if (!timer) {
      timer = later();
      // 如果是立即执行，调用函数
      // 否则缓存参数和调用上下文
      if (immediate) {
        func.apply(this, params);
      } else {
        context = this;
        args = params;
      }
    // 如果已有延迟执行函数（later），调用的时候清除原来的并重新设定一个
    // 这样做延迟函数会重新计时
    } else {
      clearTimeout(timer);
      timer = later();
    }
  };
}
export function throttle(fn) {
  // 4、通过闭包保存一个标记
  let canRun = true;
  return () => {
    // 5、在函数开头判断标志是否为 true，不为 true 则中断函数
    if (!canRun) {
      return;
    }
    // 6、将 canRun 设置为 false，防止执行之前再被执行
    canRun = false;
    // 7、定时器
    window.setTimeout(() => {
      // eslint-disable-next-line prefer-rest-params
      fn.call(this, arguments);
      // 8、执行完事件（比如调用完接口）之后，重新将这个标志设置为 true
      canRun = true;
    }, 1000);
  };
}

export const browser = {
  versions: () => {
    const u = navigator.userAgent;
    return { //  移动终端浏览器版本信息
      trident: u.indexOf('Trident') > -1, //  IE内核
      presto: u.indexOf('Presto') > -1, //  opera内核
      webKit: u.indexOf('AppleWebKit') > -1, //  苹果、谷歌内核
      gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') === -1, //  火狐内核
      mobile: !!u.match(/AppleWebKit.*Mobile.*/) || !!u.match(/AppleWebKit/), //  是否为移动终端
      ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //  ios终端
      android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //  android终端或者uc浏览器
      iPhone: u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1, //  是否为iPhone或者QQHD浏览器
      iPad: u.indexOf('iPad') > -1, //  是否iPad
      webApp: u.indexOf('Safari') === -1, //  是否web应该程序，没有头部与底部
      weixin: u.indexOf('MicroMessenger') > -1, //  是否微信 （2015-01-22新增）
      qq: u.match(/\sQQ/i) === 'qq', //  是否QQ
    };
  },
  language: (navigator.browserLanguage || navigator.language).toLowerCase(),
};
